#include <iostream>
#include <thread>

/*
 * 线程本地存储(Thread Local Storage, TLS)是一种在线程内部共享数据的数据交换区域。
 *
 * 每个线程都可以在这个区域保存它们要在内部共享的数据。
 *
 * 一个比较知名的例子是C语言的全局变量errno。对于errno这类的全局变量来说，如果多线程进程的某一个线程对其进行了
 * 修改，那么这个变量就会影响到其他所有的线程。这显然和实际需求相悖，因此全局变量errno必须保存在TLS中。
 *
 * 为解决这个矛盾，C++11标准新增了一个限定符thread_local。它能将指定变量和特定的线程联系起来。由它限定的变量被
 * 初始化，并且会被保存在TLS中。
 */ 

thread_local int tmp = 3;

int main()
{
	std::cout << tmp << std::endl;
}


#if 0
/*
 * intel
 */
00000000000011a9 <main>:
    11a9:	f3 0f 1e fa          	endbr64 
    11ad:	55                   	push   %rbp
    11ae:	48 89 e5             	mov    %rsp,%rbp
    11b1:	64 8b 04 25 fc ff ff 	mov    %fs:0xfffffffffffffffc,%eax
    11b8:	ff 
    11b9:	89 c6                	mov    %eax,%esi
    11bb:	48 8d 3d 7e 2e 00 00 	lea    0x2e7e(%rip),%rdi        # 4040 <_ZSt4cout@@GLIBCXX_3.4>
    11c2:	e8 e9 fe ff ff       	callq  10b0 <_ZNSolsEi@plt>
    11c7:	48 89 c2             	mov    %rax,%rdx
    11ca:	48 8b 05 ff 2d 00 00 	mov    0x2dff(%rip),%rax        # 3fd0 <_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4>
    11d1:	48 89 c6             	mov    %rax,%rsi
    11d4:	48 89 d7             	mov    %rdx,%rdi
    11d7:	e8 b4 fe ff ff       	callq  1090 <_ZNSolsEPFRSoS_E@plt>
    11dc:	b8 00 00 00 00       	mov    $0x0,%eax
    11e1:	5d                   	pop    %rbp
    11e2:	c3                   	retq   

/*
 * arm
 */
00000000004008bc <main>:
  4008bc:	a9bf7bfd 	stp	x29, x30, [sp, #-16]!
  4008c0:	910003fd 	mov	x29, sp
  4008c4:	d53bd040 	mrs	x0, tpidr_el0
  4008c8:	91400000 	add	x0, x0, #0x0, lsl #12
  4008cc:	91004000 	add	x0, x0, #0x10
  4008d0:	b9400001 	ldr	w1, [x0]
  4008d4:	b0000080 	adrp	x0, 411000 <_ZNSolsEi@GLIBCXX_3.4>
  4008d8:	91016000 	add	x0, x0, #0x58
  4008dc:	97ffff95 	bl	400730 <_ZNSolsEi@plt>
  4008e0:	aa0003e2 	mov	x2, x0
  4008e4:	90000000 	adrp	x0, 400000 <tmp+0x400000>
  4008e8:	911ec000 	add	x0, x0, #0x7b0
  4008ec:	aa0003e1 	mov	x1, x0
  4008f0:	aa0203e0 	mov	x0, x2
  4008f4:	97ffffab 	bl	4007a0 <_ZNSolsEPFRSoS_E@plt>
  4008f8:	52800000 	mov	w0, #0x0                   	// #0
  4008fc:	a8c17bfd 	ldp	x29, x30, [sp], #16
  400900:	d65f03c0 	ret


#endif

